package module.StoreService.Impl;

import common.model.Entity.StoreEntity.Cart;
import dao.StoreDao.CartDao;
import dao.impl.StoreDaoImpl.CartDaoImpl;
import module.StoreService.CartService;
import network.protocol.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Optional;

/**
 * {@code CartServiceImpl} 是 {@link CartService} 的实现类，
 * 提供与购物车相关的业务逻辑实现。
 * <p>
 * 主要功能：
 * <ul>
 *     <li>根据用户 ID 获取购物车</li>
 *     <li>为用户创建购物车</li>
 *     <li>清空购物车</li>
 *     <li>根据用户 ID 获取或创建购物车 ID</li>
 * </ul>
 * <p>
 * 实现逻辑通过 {@link CartDao} 与数据库交互，
 * 并使用 {@link Response} 封装统一的操作结果。
 * <p>
 * 类内部采用单例模式，请通过 {@link #getInstance()} 获取实例。
 */
public class CartServiceImpl implements CartService {
    private static final Logger logger = LoggerFactory.getLogger(CartServiceImpl.class);
    private final CartDao cartDao = new CartDaoImpl();
    private static final CartServiceImpl INSTANCE = new CartServiceImpl();

    /**
     * 私有构造函数，避免外部直接实例化。
     */
    private CartServiceImpl() {}

    /**
     * 获取 {@code CartServiceImpl} 的单例对象。
     *
     * @return 单例实例
     */
    public static CartServiceImpl getInstance() {
        return INSTANCE;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Response<Optional<Cart>> getCartByUserId(long userId) {
        try {
            Optional<Cart> cart = cartDao.findByUser(userId);
            return Response.success(cart);
        } catch (Exception e) {
            logger.error("获取用户购物车失败: userId={}", userId, e);
            return Response.error("获取用户购物车失败: " + e.getMessage());
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Response<Boolean> createCart(long userId) {
        try {
            Optional<Cart> existingCart = cartDao.findByUser(userId);
            if (existingCart.isPresent()) {
                logger.warn("创建购物车失败: 用户ID {} 已存在购物车", userId);
                return Response.error("用户已存在购物车");
            }

            Cart cart = new Cart();
            cart.setUserId(userId);
            boolean result = cartDao.save(cart);
            return result ? Response.success(true) : Response.error("创建购物车失败");
        } catch (Exception e) {
            logger.error("创建购物车失败: userId={}", userId, e);
            return Response.error("创建购物车失败: " + e.getMessage());
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Response<Boolean> clearCart(long userId) {
        try {
            Optional<Cart> cart = cartDao.findByUser(userId);
            if (cart.isEmpty()) {
                logger.warn("清空购物车失败: 用户ID {} 不存在购物车", userId);
                return Response.error("用户不存在购物车");
            }

            boolean result = cartDao.clearCart(userId);
            return result ? Response.success(true) : Response.error("清空购物车失败");
        } catch (Exception e) {
            logger.error("清空购物车失败: userId={}", userId, e);
            return Response.error("清空购物车失败: " + e.getMessage());
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Response<Long> getOrCreateCartId(long userId) {
        try {
            Optional<Cart> cart = cartDao.findByUser(userId);
            if (cart.isPresent()) {
                return Response.success(cart.get().getId());
            }

            Cart newCart = new Cart();
            newCart.setUserId(userId);
            boolean created = cartDao.save(newCart);
            if (created) {
                Optional<Cart> createdCart = cartDao.findByUser(userId);
                if (createdCart.isPresent()) {
                    return Response.success(createdCart.get().getId());
                }
            }

            logger.error("获取或创建购物车ID失败: userId={}", userId);
            return Response.error("获取或创建购物车ID失败");
        } catch (Exception e) {
            logger.error("获取或创建购物车ID失败: userId={}", userId, e);
            return Response.error("获取或创建购物车ID失败: " + e.getMessage());
        }
    }
}
